home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utilsys / rss14gmd.lha / RSys_1.4gmd / C / PreferenceLists.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  16KB  |  684 lines

  1. /*
  2.    ***************************************************************************
  3.    *
  4.    * Datei:
  5.    *      RSysPreferenceLists.c
  6.    *
  7.    * Inhalt:
  8.    *
  9.    *      --- Globale Routinen ---
  10.    *
  11.    *    void MakeHeadEntry ( int *num , char *title );
  12.    *    void MakeHexEntry ( int *num , char *title , APTR entry );
  13.    *    void SysEnvList ( void );
  14.    *    void SysExtPrinterData ( void );
  15.    *    void SysPrefList ( void );
  16.    *
  17.    *      --- Lokale  Routinen ---
  18.    *
  19.    *    static void MakeColEntry ( int *num , char *title , long entry );
  20.    *    static void MakeMeasureEntry ( int *num , char *title , long entry , char *measure );
  21.    *    static void MakeNumEntry ( int *num , char *title , long entry );
  22.    *    static void MakeStringEntry ( int *num , char *title , char *entry );
  23.    *    static void MakeTimeEntry ( int *num , char *title , TIMEVAL *tv );
  24.    *
  25.    * Bemerkungen:
  26.    *      Liste der System- und Druckereinstellungen sowie der Env:-Variablen.
  27.    *
  28.    * Erstellungsdatum:
  29.    *      07-Jul-93     Rolf Böhme
  30.    *
  31.    * Änderungen:
  32.    *      07-Jul-93     Rolf Böhme        Erstellung
  33.    *
  34.    ***************************************************************************
  35.  */
  36.  
  37. #include "RSys.h"
  38. #include "protos.h"
  39.  
  40.  /*
  41.   * MakeNumEntry() erzeugt ein Zahleneintrag für die
  42.   * anzuzeigende Liste
  43.   */
  44. static void
  45. MakeNumEntry (int *num, char *title, long entry)
  46. {
  47.   sprintf (Entries[*num].se_Entry, "%-22s : %ld", title, entry);
  48.   AddNodeToList (*num, NO_SORT, 0);
  49.  
  50.   (*num)++;
  51.  
  52.   return;
  53. }
  54.  
  55.  /*
  56.   * MakeStringEntry() erzeugt ein Zeileneintrag für die
  57.   * anzuzeigende Liste
  58.   */
  59. static void
  60. MakeStringEntry (int *num, char *title, char *entry)
  61. {
  62.   sprintf (Entries[*num].se_Entry, "%-22s : %s", title, entry);
  63.   AddNodeToList (*num, NO_SORT, 0);
  64.  
  65.   (*num)++;
  66.  
  67.   return;
  68. }
  69.  
  70.  /*
  71.   * MakeHeadEntry() erzeugt eine Titelzeileneintrag für die
  72.   * anzuzeigende Liste
  73.   */
  74. void
  75. MakeHeadEntry (int *num, char *title)
  76. {
  77.   strcpy (Entries[*num].se_Entry, field[BLANK_FIELD]);
  78.   AddNodeToList (*num, NO_SORT, 0);
  79.  
  80.   (*num)++;
  81.  
  82.   strncpy (Entries[*num].se_Entry, title, BUFSIZE);
  83.   AddNodeToList (*num, NO_SORT, 0);
  84.  
  85.   (*num)++;
  86.  
  87.   return;
  88. }
  89.  
  90.  /*
  91.   * MakeColEntry() erzeugt ein Zahleneintrag für die
  92.   * anzuzeigende Liste in einem bestimmten Format
  93.   */
  94. static void
  95. MakeColEntry (int *num, char *title, long entry)
  96. {
  97.   sprintf (Entries[*num].se_Entry, "%-22s : 0x%04lX", title, (long) entry);
  98.   AddNodeToList (*num, NO_SORT, 0);
  99.  
  100.   (*num)++;
  101.  
  102.   return;
  103. }
  104.  
  105.  /*
  106.   * MakeHexEntry() erzeugt einen hexadezimalen
  107.   * Zahleneintrag für die anzuzeigende Liste
  108.   */
  109. void
  110. MakeHexEntry (int *num, char *title, APTR entry)
  111. {
  112.   sprintf (Entries[*num].se_Entry, "%-14s : 0x%08lX", title, entry);
  113.   AddNodeToList (*num, NO_SORT, 0);
  114.  
  115.   (*num)++;
  116.  
  117.   return;
  118. }
  119.  
  120.  /*
  121.   * MakeTimeEntry() erzeugt einen Zeiteintrag für die
  122.   * anzuzeigende Liste
  123.   */
  124. static void
  125. MakeTimeEntry (int *num, char *title, TIMEVAL * tv)
  126. {
  127.   sprintf (Entries[*num].se_Entry, "%-22s : %ld sec %-6ld µsec",
  128.        title, tv->tv_secs, tv->tv_micro);
  129.  
  130.   AddNodeToList (*num, NO_SORT, 0);
  131.  
  132.   (*num)++;
  133.  
  134.   return;
  135. }
  136.  
  137.  /*
  138.   * MakeMeasureEntry() erzeugt ein Maßzahleneintrag für die
  139.   * anzuzeigende Liste
  140.   */
  141. static void
  142. MakeMeasureEntry (int *num, char *title, long entry, char *measure)
  143. {
  144.   sprintf (Entries[*num].se_Entry, "%-22s : %ld %s",
  145.        title, (long) entry, measure);
  146.  
  147.   AddNodeToList (*num, NO_SORT, 0);
  148.  
  149.   (*num)++;
  150.  
  151.   return;
  152. }
  153.  
  154.  /*
  155.   * SysPrefList() listet die Preferenceseinstellungen auf.
  156.   * Diese werden NICHT aus den 2.0-IFF-Prefs-Dateien
  157.   * geholt, sondern mit einer Systemfunktion ausgelesen
  158.   */
  159. void
  160. SysPrefList (void)
  161. {
  162.   int i = 0;
  163.   PREFERENCES PrefCopy, *PCptr;
  164.   char *prtype = "Printer type", *prshade = "Print shade", *prpaper = "Paper size",
  165.    *baudrate = "Baud rate", *parity = "Parity", *handshake = "Handshake",
  166.    *baud = "Baud";
  167.  
  168.   DPOS;
  169.  
  170.   HandleHelp (MN_SysPrefList);
  171.  
  172.   if (PCptr = GetPrefs (&PrefCopy, sizeof (PREFERENCES)))
  173.     {
  174.       PrintHeader (PREFS, NULL);
  175.  
  176.       EmptyListView ();
  177.  
  178.       PrintInfo ("Read Preferences", NO_SPEAK, 0);
  179.  
  180.       countentries = 61;
  181.       Entries = AllocScrollEntries (countentries);
  182.  
  183.       strcpy (Entries[i].se_Entry, "----- Input/Keyboard:");
  184.       AddNodeToList (i++, NO_SORT, 0);
  185.  
  186.       MakeTimeEntry (&i, "Keyboard repeat speed", &PCptr->KeyRptSpeed);
  187.  
  188.       MakeTimeEntry (&i, "Keyboard repeat delay", &PCptr->KeyRptDelay);
  189.  
  190.       MakeTimeEntry (&i, "Double click time", &PCptr->DoubleClick);
  191.  
  192.  
  193.       MakeHeadEntry (&i, "----- Pointer");
  194.  
  195.       /* Intuition Pointer data */
  196.       MakeNumEntry (&i, "\"Hot spot\" X", (long) PCptr->XOffset);
  197.       MakeNumEntry (&i, "\"Hot spot\" Y", (long) PCptr->YOffset);
  198.  
  199.       MakeColEntry (&i, "Pointer Sprite Col 0", (long) PCptr->color17);
  200.       MakeColEntry (&i, "Pointer Sprite Col 1", (long) PCptr->color18);
  201.       MakeColEntry (&i, "Pointer Sprite Col 2", (long) PCptr->color19);
  202.  
  203.       MakeNumEntry (&i, "Pointer Sensitivity", (long) PCptr->PointerTicks);
  204.  
  205.  
  206.  
  207.       MakeHeadEntry (&i, "----- Workbench");
  208.  
  209.       MakeNumEntry (&i, "Height default font", (long) PCptr->FontHeight);
  210.  
  211.       MakeColEntry (&i, "Standard Color 0", (long) PCptr->color0);
  212.       MakeColEntry (&i, "Standard Color 1", (long) PCptr->color1);
  213.       MakeColEntry (&i, "Standard Color 2", (long) PCptr->color2);
  214.       MakeColEntry (&i, "Standard Color 3", (long) PCptr->color3);
  215.  
  216.       MakeNumEntry (&i, "View X-Offset", (long) PCptr->ViewXOffset);
  217.       MakeNumEntry (&i, "View Y-Offset", (long) PCptr->ViewYOffset);
  218.       MakeNumEntry (&i, "View init offset X", (long) PCptr->ViewInitX);
  219.       MakeNumEntry (&i, "View init offset Y", (long) PCptr->ViewInitY);
  220.  
  221.       MakeNumEntry (&i, "Height default font", (long) PCptr->FontHeight);
  222.  
  223.       MakeStringEntry (&i, "CLI availability",
  224.                (PCptr->EnableCLI ? "CLI enabled" : "CLI disabled"));
  225.  
  226.       MakeStringEntry (&i, "Workbench interlaced",
  227.                (PCptr->LaceWB ? "Yes" : "No"));
  228.  
  229.       MakeNumEntry (&i, "Override WB width", (long) PCptr->wb_Width);
  230.  
  231.       MakeNumEntry (&i, "Override WB height", (long) PCptr->wb_Height);
  232.  
  233.       MakeNumEntry (&i, "Override WB depth", (long) PCptr->wb_Depth);
  234.  
  235.       MakeNumEntry (&i, "Extension Info size", (long) PCptr->ext_size);
  236.  
  237.  
  238.  
  239.       MakeHeadEntry (&i, "----- Printer");
  240.  
  241.       MakeStringEntry (&i, "Printer port",
  242.             (PCptr->PrinterPort ? "Serial port" : "Parallel port"));
  243.  
  244.       switch (PCptr->PrinterType)
  245.     {
  246.     case 0x00:
  247.       MakeStringEntry (&i, prtype, "Custom");
  248.       break;
  249.  
  250.     case 0x01:
  251.       MakeStringEntry (&i, prtype, "Alpha P101");
  252.       break;
  253.  
  254.     case 0x02:
  255.       MakeStringEntry (&i, prtype, "Brother 15XL");
  256.       break;
  257.  
  258.     case 0x03:
  259.       MakeStringEntry (&i, prtype, "CBM MPS1000");
  260.       break;
  261.  
  262.     case 0x04:
  263.       MakeStringEntry (&i, prtype, "Diabolo 630");
  264.       break;
  265.  
  266.     case 0x05:
  267.       MakeStringEntry (&i, prtype, "Diabolo ADV-D25");
  268.       break;
  269.  
  270.     case 0x06:
  271.       MakeStringEntry (&i, prtype, "Diabolo C-150");
  272.       break;
  273.  
  274.     case 0x07:
  275.       MakeStringEntry (&i, prtype, "Epson");
  276.       break;
  277.  
  278.     case 0x08:
  279.       MakeStringEntry (&i, prtype, "Epson JX-80");
  280.       break;
  281.  
  282.     case 0x09:
  283.       MakeStringEntry (&i, prtype, "Okimate 20");
  284.       break;
  285.  
  286.     case 0x0A:
  287.       MakeStringEntry (&i, prtype, "Qume-LP 20");
  288.       break;
  289.  
  290.     case 0x0B:
  291.       MakeStringEntry (&i, prtype, "HP-Laserjet");
  292.       break;
  293.  
  294.     case 0x0C:
  295.       MakeStringEntry (&i, prtype, "HP-Laserjet +");
  296.       break;
  297.  
  298.     default:
  299.       MakeStringEntry (&i, prtype, "Unknown");
  300.       break;
  301.     }
  302.  
  303.       MakeStringEntry (&i, "Printer Driver", (char *) PCptr->PrinterFilename);
  304.  
  305.       MakeNumEntry (&i, "Print pitch", (long) PCptr->PrintPitch);
  306.  
  307.       MakeStringEntry (&i, "Print quality",
  308.                (PCptr->PrintQuality ? "Letter" : "Draft"));
  309.  
  310.       MakeStringEntry (&i, "Lines per inch",
  311.                (PCptr->PrintSpacing ? "8 LPI" : "6 LPI"));
  312.  
  313.       MakeNumEntry (&i, "Left margin", (long) PCptr->PrintLeftMargin);
  314.  
  315.       MakeMeasureEntry (&i, "Right margin", (long) PCptr->PrintRightMargin,
  316.             "Chars");
  317.  
  318.       MakeStringEntry (&i, "Print image",
  319.                (PCptr->PrintImage ? "Negative" : "Positive"));
  320.  
  321.       MakeStringEntry (&i, "Print aspect",
  322.                (PCptr->PrintImage ? "Vertical" : "Horizontal"));
  323.  
  324.  
  325.       switch (PCptr->PrintShade)
  326.     {
  327.     case 0:
  328.       MakeStringEntry (&i, prshade, "Black/White");
  329.       break;
  330.  
  331.     case 1:
  332.       MakeStringEntry (&i, prshade, "Grey scale");
  333.       break;
  334.  
  335.     default:
  336.       MakeStringEntry (&i, prshade, "Color");
  337.       break;
  338.     }
  339.  
  340.       MakeNumEntry (&i, "Print Threshold", (long) PCptr->PrintThreshold);
  341.  
  342.       switch (PCptr->PaperSize)
  343.     {
  344.     case US_LETTER:
  345.       MakeStringEntry (&i, prpaper, "USA Letter");
  346.       break;
  347.  
  348.     case US_LEGAL:
  349.       MakeStringEntry (&i, prpaper, "USA Legal");
  350.       break;
  351.  
  352.     case N_TRACTOR:
  353.       MakeStringEntry (&i, prpaper, "Narrow tractor");
  354.       break;
  355.  
  356.     case W_TRACTOR:
  357.       MakeStringEntry (&i, prpaper, "Wide tractor");
  358.       break;
  359.  
  360.     case CUSTOM:
  361.       MakeStringEntry (&i, prpaper, "Custom width");
  362.       break;
  363.  
  364.     }
  365.  
  366.       MakeMeasureEntry (&i, "Paper length", (long) PCptr->PaperLength,
  367.             "Rows");
  368.  
  369.       MakeStringEntry (&i, "Paper type",
  370.              (PCptr->PaperType ? "Single paper" : "Fanfold paper"));
  371.  
  372. #if 0
  373. /*GMD 08Jul95 ; WorkName undefined */
  374.  
  375.       MakeStringEntry (&i, "Temp file for printer",
  376.              ((PCptr->WorkName != NULL) ? (char *) PCptr->WorkName :
  377.               (char *) "None"));
  378. #endif
  379.  
  380.       MakeNumEntry (&i, "Affect Rows/Columns", (long) PCptr->RowSizeChange);
  381.  
  382.       sprintf (Entries[i].se_Entry, "User preference flags  : 0x%08lX",
  383.            PCptr->PrintFlags);
  384.       AddNodeToList (i++, NO_SORT, 0);
  385.  
  386.       MakeMeasureEntry (&i, "Max width of picture", (long) PCptr->PrintMaxWidth / 10,
  387.             "inch");
  388.  
  389.       MakeMeasureEntry (&i, "Max height of picture", (long) PCptr->PrintMaxHeight / 10,
  390.             "inch");
  391.       MakeMeasureEntry (&i, "Offset of picture", (long) PCptr->PrintXOffset / 10,
  392.             "inch");
  393.       MakeNumEntry (&i, "Print density", (long) PCptr->PrintDensity);
  394.  
  395.  
  396.  
  397.       MakeHeadEntry (&i, "----- Serial configuration");
  398.  
  399.       switch (PCptr->BaudRate)
  400.     {
  401.     case 0x00:
  402.       MakeMeasureEntry (&i, baudrate, 110L, baud);
  403.       break;
  404.  
  405.     case 0x01:
  406.       MakeMeasureEntry (&i, baudrate, 300L, baud);
  407.       break;
  408.  
  409.     case 0x02:
  410.       MakeMeasureEntry (&i, baudrate, 1200L, baud);
  411.       break;
  412.  
  413.     case 0x03:
  414.       MakeMeasureEntry (&i, baudrate, 2400L, baud);
  415.       break;
  416.  
  417.     case 0x04:
  418.       MakeMeasureEntry (&i, baudrate, 4800L, baud);
  419.       break;
  420.  
  421.     case 0x05:
  422.       MakeMeasureEntry (&i, baudrate, 9600L, baud);
  423.       break;
  424.  
  425.     case 0x06:
  426.       MakeMeasureEntry (&i, baudrate, 19200L, baud);
  427.       break;
  428.  
  429.     case 0x07:
  430.       MakeStringEntry (&i, baudrate, "MIDI (31.250 baud)");
  431.       break;
  432.  
  433.     default:
  434.       MakeStringEntry (&i, baudrate, (char *) field[NO_BAUD]);
  435.       break;
  436.     }
  437.  
  438.       MakeNumEntry (&i, "Read bits", (long) SRBNUM (PCptr->SerRWBits));
  439.       MakeNumEntry (&i, "Write bits", (long) SWBNUM (PCptr->SerRWBits));
  440.  
  441.       MakeNumEntry (&i, "Stop bits", (long) SSBNUM (PCptr->SerStopBuf));
  442.  
  443.       switch (SPARNUM (PCptr->SerParShk))
  444.     {
  445.     case SPARITY_NONE:
  446.       MakeStringEntry (&i, parity, "None");
  447.       break;
  448.  
  449.     case SPARITY_EVEN:
  450.       MakeStringEntry (&i, parity, "Even");
  451.       break;
  452.  
  453.     case SPARITY_ODD:
  454.       MakeStringEntry (&i, parity, "Odd");
  455.       break;
  456.  
  457.     default:
  458.       MakeStringEntry (&i, parity, (char *) field[NO_PARITY]);
  459.       break;
  460.     }
  461.  
  462.       switch (SHAKNUM (PCptr->SerParShk))
  463.     {
  464.     case SHSHAKE_XON:
  465.       MakeStringEntry (&i, handshake, "XOn/XOff");
  466.       break;
  467.  
  468.     case SHSHAKE_RTS:
  469.       MakeStringEntry (&i, handshake, "RTS/CTS");
  470.       break;
  471.  
  472.     case SHSHAKE_NONE:
  473.       MakeStringEntry (&i, handshake, "None");
  474.       break;
  475.  
  476.     default:
  477.       MakeStringEntry (&i, handshake, (char *) field[NO_HANDSHK]);
  478.       break;
  479.     }
  480.     }
  481.   else
  482.     ErrorHandle ("GetPrefs()", ENV_ERR, INFO_FAIL, NO_KILL);
  483.  
  484.   PrintStatistics ();
  485.  
  486.   return;
  487. }
  488.  
  489.  
  490.  /*
  491.   * SysEnvList() erzeugt eine Liste aller Dateien
  492.   * (Environmentvariablen) im Verzeichnis ENV:
  493.   */
  494. void
  495. SysEnvList (void)
  496. {
  497.   int i;
  498.   UBYTE envline[MAXFULLNAME + 1];
  499.   char envname[ENVLEN + 1], envfullname[MAXFULLNAME];
  500.   EXALLCONTROL *eac;
  501.   EXALLDATA *EAData, *ead;
  502.   int more;
  503.   long s;
  504.   int d = 0;
  505.   BPTR lock;
  506.   int ftyp;
  507.  
  508.   DPOS;
  509.  
  510.   HandleHelp (MN_SysEnvList);
  511.  
  512.   PrintHeader (ENVVARS, NULL);
  513.  
  514.   EmptyListView ();
  515.  
  516.   if (lock = Lock ((UBYTE *) "ENV:", ACCESS_READ))
  517.     {
  518.       countentries = SizeOfDir (lock, &s, &d);
  519.       countentries += d;
  520.  
  521.       if (NoEntries ())
  522.     {
  523.       UnLock (lock);
  524.       return;
  525.     }
  526.  
  527.       Entries = AllocScrollEntries (countentries);
  528.  
  529.       i = 0;
  530.  
  531.       if (eac = AllocDosObject (DOS_EXALLCONTROL, NULL))
  532.     {
  533.       eac->eac_LastKey = 0;
  534.  
  535.       EAData = MyAllocVec ((MAXLARGEMEM + 1) * sizeof (EXALLDATA),
  536.                    MEMF_ANY | MEMF_CLEAR, NO_KILL);
  537.  
  538.       if (EAData)
  539.         {
  540.           do
  541.         {
  542.           more = ExAll (lock, EAData, MAXLARGEMEM * sizeof (EXALLDATA),
  543.                 ED_TYPE, eac);
  544.  
  545.           if ((!more) && (IoErr () != ERROR_NO_MORE_ENTRIES))
  546.             {
  547.               ErrorHandle ("ENV:", DOS_EXALL_ERR, EXALL_FAIL, NO_KILL);
  548.               break;
  549.             }
  550.  
  551.           if (eac->eac_Entries == 0)
  552.             continue;
  553.  
  554.           ead = EAData;
  555.  
  556.           do
  557.             {
  558.               strncpy (envname, (char *) ead->ed_Name, ENVLEN);
  559.               envname[ENVLEN] = STRINGEND;
  560.               sprintf (envfullname, "ENV:%s", envname);
  561.  
  562.               ftyp = filetype ((char *) envfullname);
  563.  
  564.               if (ead->ed_Type > 0)
  565.             sprintf (Entries[i].se_Entry, EntryAttr[ENVVARS].ea_dataformat,
  566.                  envname, "<dir>");
  567.               else if (ftyp == TYPE_TEXT)
  568.             {
  569.               if (GetVar ((STRPTR) envname, envline, MAXFULLNAME, GVF_GLOBAL_ONLY) > 0)
  570.                 {
  571.                   envline[MAXSTRLEN - 1] = STRINGEND;
  572.  
  573.                   sprintf (Entries[i].se_Entry, EntryAttr[ENVVARS].ea_dataformat,
  574.                        envname, (char *) envline);
  575.                 }
  576.               else
  577.                 sprintf (Entries[i].se_Entry,
  578.                      EntryAttr[ENVVARS].ea_dataformat,
  579.                      envname, "<env error>");
  580.             }
  581.               else
  582.             sprintf (Entries[i].se_Entry,
  583.                  EntryAttr[ENVVARS].ea_dataformat,
  584.                  envname, "<no text>");
  585.  
  586.               AddNodeToList (i++, SORT, 0);
  587.  
  588.               ead = ead->ed_Next;
  589.             }
  590.           while (ead && (i < countentries));
  591.         }
  592.           while (more && (i < countentries));
  593.  
  594.           MyFreeVec (EAData);
  595.         }
  596.  
  597.       FreeDosObject (DOS_EXALLCONTROL, eac);
  598.     }
  599.       else
  600.     ErrorHandle ("AllocDosObject()", MEMORY_ERR, ALLOC_FAIL, NO_KILL);
  601.  
  602.       UnLock (lock);
  603.     }
  604.   else
  605.     {
  606.       ErrorHandle ("ENV:-Lock", ENV_ERR, FIND_FAIL, NO_KILL);
  607.       return;
  608.     }
  609.  
  610.   PrintStatistics ();
  611.  
  612.   return;
  613. }
  614.  
  615.  
  616.  
  617. void
  618. SysExtPrinterData (void)
  619. {
  620.   union printerIO
  621.   {
  622.     IOSTDREQ ios;
  623.     IODRPREQ iodrp;
  624.     IOPRTCMDREQ iopc;
  625.   }
  626.    *PIO;
  627.   MSGPORT *PrinterMP;
  628.   PRINTERDATA *PD;
  629.   PRINTEREXTENDEDDATA *PED;
  630.   int i = 0;
  631.  
  632.   DPOS;
  633.  
  634.   HandleHelp (MN_SysExtPrinterData);
  635.  
  636.   PrintHeader (E_PRINTERDATA, NULL);
  637.  
  638.   EmptyListView ();
  639.  
  640.   countentries = 13;
  641.   Entries = AllocScrollEntries (countentries);
  642.  
  643.   if (PrinterMP = (MSGPORT *) CreateMsgPort ())
  644.     {
  645.       if (PIO = (union printerIO *) CreateExtIO (PrinterMP,
  646.                          sizeof (union printerIO)))
  647.     {
  648.       if (!(OpenDevice ((STRPTR) "printer.device", 0,
  649.                 (IOREQUEST *) PIO, 0)))
  650.         {
  651.           PD = (PRINTERDATA *) PIO->iodrp.io_Device;
  652.           PED = (PRINTEREXTENDEDDATA *) & PD->pd_SegmentData->ps_PED;
  653.  
  654.           MakeStringEntry (&i, "Printer name", PED->ped_PrinterName);
  655.           MakeNumEntry (&i, "Version", (long) PD->pd_SegmentData->ps_Version);
  656.           MakeNumEntry (&i, "Revision", (long) PD->pd_SegmentData->ps_Revision);
  657.  
  658.           MakeNumEntry (&i, "Printer class", (long) PED->ped_PrinterClass);
  659.           MakeNumEntry (&i, "Color class", (long) PED->ped_ColorClass);
  660.  
  661.           MakeNumEntry (&i, "Print columns", (long) PED->ped_MaxColumns);
  662.           MakeNumEntry (&i, "Char sets", (long) PED->ped_NumCharSets);
  663.           MakeNumEntry (&i, "Print head pins", (long) PED->ped_NumRows);
  664.  
  665.           MakeMeasureEntry (&i, "Max X-dots in dump", PED->ped_MaxXDots, "dots");
  666.           MakeMeasureEntry (&i, "Max Y-dots in dump", PED->ped_MaxYDots, "dots");
  667.           MakeMeasureEntry (&i, "Density X", (long) PED->ped_XDotsInch, "dots/inch");
  668.           MakeMeasureEntry (&i, "Density Y", (long) PED->ped_YDotsInch, "dots/inch");
  669.           MakeMeasureEntry (&i, "Timeout", (long) PED->ped_TimeoutSecs, "sec");
  670.  
  671.           CloseDevice ((IOREQUEST *) PIO);
  672.         }
  673.  
  674.       DeleteExtIO ((IOREQUEST *) PIO);
  675.     }
  676.  
  677.       DeleteMsgPort ((MSGPORT *) PrinterMP);
  678.     }
  679.  
  680.   PrintStatistics ();
  681.  
  682.   return;
  683. }
  684.